Go 官网教程跟学
go 的官网教程和主流的编程教程网站风格截然不同,应该是没用任何前端框架,纯手糊出来的 ,有一种老式风格的美。
管理模块(module)
新建一个项目后,首先做的是建立一个go.mod
文件,来管理这个模块。模块即项目。go.mod
位于项目的根目录。
go mod init <moduleName>
管理包(package)
这里的包可以类比 nodejs 中的库,来自外部。go 只有内置的一种包管理器,不像 node 有那么多选择。导入外部包的步骤是:
- 先在文件开头写上
import <name>
- 运行
go mod tidy
go mod tidy
会更新go.mod
go.sum
两个文件的依赖信息。
变量声明和初始化机制
在 Go 语言中,变量的声明和初始化可以通过多种方式实现,具体取决于你是否需要显式指定变量类型。以下是几种常见的方式:
- 使用
var
关键字声明并初始化变量 Go 允许你使用var
关键字声明变量并指定初始值:
var 变量名 数据类型 = 初始值
示例:
var age int = 25
var name string = "Alice"
- 类型推断
如果你在声明时赋予了初始值,Go 可以根据初始值推断变量的类型,因此可以省略类型:
var age = 25
var name = "Alice"
- 简短声明(:=)
在函数内部,使用 :=
可以简化变量的声明和初始化。这是一种常用的简写方式,不需要 var
关键字,也不需要显式指定类型:
age := 25
name := "Alice"
- 声明多个变量
你可以一次声明多个变量,使用 var
或简短声明方式:
var a, b, c int = 1, 2, 3
x, y := "Hello", "World"
- 声明但不初始化
如果不指定初始值,Go 会为变量赋予其默认值(零值),如 int
默认值为 0
,string
默认值为 ""
,bool
默认值为 false
。
var age int // 默认值为 0
var name string // 默认值为 ""
示例
package main
import "fmt"
func main() {
var age int = 30 // 声明并初始化
var name = "Bob" // 类型推断
height := 1.75 // 简短声明
var isStudent bool // 声明但不初始化,默认值为 false
fmt.Println(age, name, height, isStudent)
}
关键点
-
使用
var
关键字可以在函数外部和内部声明变量。 -
简短声明
:=
只能在函数内部使用。 -
Go 强调显式和简洁的变量声明风格,类型推断和简短声明常用于简化代码。
函数定义方式
在 Go 语言中,函数的定义语法如下:
func 函数名(参数列表) 返回值类型 {
// 函数体
}
下面是一个具体的例子:
package main
import "fmt"
// 定义一个无返回值的函数
func sayHello() {
fmt.Println("Hello, Go!")
}
// 定义一个带参数和返回值的函数
func add(a int, b int) int {
return a + b
}
func main() {
// 调用无返回值的函数
sayHello()
// 调用带参数和返回值的函数
sum := add(5, 7)
fmt.Println("Sum:", sum)
}
关键点:
-
func
关键字用于定义函数。 -
参数列表中的每个参数都需要指定类型。如果多个参数类型相同,可以将类型合并,例如
func add(a, b int) int
。 -
返回值类型放在参数列表后面。
-
函数可以有多个返回值,返回值使用括号括起来,例如
func swap(a, b int) (int, int)
。
错误处理
go 的异常处理机制似乎“臭名昭著”。
message, err := greetings.Hello("fads")
// If an error was returned, print it to the console and
// exit the program.
if err != nil {
log.Fatal(err)
}
也就是说,错误没有传递机制,所以,就要写很多的if err != nil
。
数据结构
slice
slice 是一种没有预先设定长度的数组,故而比较灵活。
formats := []string{
"Hi, %v. Welcome!",
"Great to see you, %v!",
"Hail, %v! Well met!",
}
map
map 就是键值对。需要用一个 make 函数来创建。(也可以用字面量方式创建)
// 创建
messages := make(map[string]string)
//赋值
messages[name] = message
测试
go 同样内置了测试机制。创建一个xxx_test.go
文件。
package greetings
import (
"testing"
"regexp"
)
// TestHelloName calls greetings.Hello with a name, checking
// for a valid return value.
func TestHelloName(t *testing.T) {
name := "Gladys"
want := regexp.MustCompile(`\b`+name+`\b`)
msg, err := Hello("Gladys")
if !want.MatchString(msg) || err != nil {
t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
}
}
// TestHelloEmpty calls greetings.Hello with an empty string,
// checking for an error.
func TestHelloEmpty(t *testing.T) {
msg, err := Hello("")
if msg != "" || err == nil {
t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
}
}
测试函数用 Test 开头。运行测试用例用go test <-v>
命令。